package org.ioriframework.plugin.maven.jetty.handlers;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

import org.ioriframework.plugin.maven.BaseHandler;
import org.ioriframework.plugin.maven.Constants;
import org.ioriframework.plugin.maven.Executorhandler;
import org.ioriframework.plugin.maven.console.ConsoleFactory;
import org.ioriframework.plugin.maven.console.ConsoleService;
import org.ioriframework.plugin.maven.util.MavenUtils;
import org.ioriframework.plugin.maven.util.StringUtils;

/**
 * Jetty任务处理类
 * 执行任务时，从Process返回流中读取日志，并输出到控制台
 * @author iori
 *
 */
public class JettyCommandHandler extends BaseHandler {
	
	
	/**
	 * 单例
	 */
	private JettyCommandHandler() {
		
	}
	
	private static JettyCommandHandler jettyCommandHandler;
	
	public static JettyCommandHandler getInstance() throws IOException {
		if (jettyCommandHandler == null) {
			jettyCommandHandler = new JettyCommandHandler();
		}
		return jettyCommandHandler;
	}
	
	/**
	 * 启动Jetty
	 */
	@Override
	public void run() {
		// 启动Jetty任务
		FutureTask<Integer> jettyRunTask = new FutureTask<Integer>(new Callable<Integer>() {
			public Integer call() {
				try {
					// 执行jetty:run命令
					process(buildCommand(Constants.COMMAND_JETTY_RUN));
				} catch (Exception e) {
					ConsoleService.printlnError2Console(e.getMessage());
				} finally {
					// 清除当前console实例
					ConsoleFactory.removeCurrentConsole();
				}
				return 0;
			}
		});
		// 启动新线程执行任务
		Executorhandler.getInstance().execute(jettyRunTask);
	}
	
	/**
	 * 停止Jetty
	 * @throws IOException
	 */
	public void stop() throws IOException {
		// 停止Jetty任务
		FutureTask<Integer> jettyStopTask = new FutureTask<Integer>(new Callable<Integer>() {
			public Integer call() {
				try {
					// 执行jetty:stop命令
					process(buildCommand(Constants.COMMAND_JETTY_STOP));
				} catch (Exception e) {
					ConsoleService.printlnError2Console(e.getMessage());
				} finally {
					// 清除当前console实例
					ConsoleFactory.removeCurrentConsole();
				}
				return 0;
			}
		});
		// 启动新线程执行任务
		Executorhandler.getInstance().execute(jettyStopTask);
	}
	
	@Override
	public void processSuccessCallback() {
		
	}
	
	/**
	 * 获取web项目中pom.xml的路径
	 * @return
	 */
	@Override
	protected String getPomPath() {
		// 如果当前任务中pom路径已经存在，直接返回路径
		if (!StringUtils.isNullOrEmpty(ConsoleFactory.currentConsole().getPomPath())) {
			return ConsoleFactory.currentConsole().getPomPath();
		}
		Map<String, String> projectInfo = MavenUtils.findProjectInfo("war");
		// 如果没有项目，执行异常
		if (projectInfo == null || projectInfo.isEmpty()) {
			throw new RuntimeException("[ERROR]工作空间中没有项目");
		}
		// pom.xml全路径
		String parentPomPath = projectInfo.get("parentPomPath");
		// 项目名称
		String parentProjectName = projectInfo.get("parentProjectName");
		ConsoleService.println2Console("Load pom.xml path: " + parentPomPath);
		// 如果无法找到parent项目的pom.xml，抛出异常
		if (StringUtils.isNullOrEmpty(parentPomPath)) {
			throw new RuntimeException("[ERROR] 无法找到parent项目的pom.xml文件，请检查项目配置.");
		}
		// 设置当前任务对应的pom.xml文件路径
		ConsoleFactory.currentConsole().setPomPath(parentPomPath);
		// 设置当前任务对应的项目名称
		ConsoleFactory.currentConsole().setProjectName(parentProjectName);
		return parentPomPath;
	}
}
